home *** CD-ROM | disk | FTP | other *** search
- unit uSIMEdit;
-
- {
- *******************************************************************************
- * Descriptions: SIM Card Phonebook Edit Implementation
- * $Source: /cvsroot/fma/fma/uSIMEdit.pas,v $
- * $Locker: $
- *
- * Todo:
- *
- * Change Log:
- * $Log: uSIMEdit.pas,v $
- * Revision 1.20.2.1 2004/09/10 12:12:56 z_stoichev
- * - Fixed 998626 "/O" added to Contact names.
- *
- * Revision 1.20 2004/08/27 20:42:00 lordlarry
- * Merge from newxml
- *
- * Revision 1.19.4.1 2004/08/25 15:41:13 merijnb
- * added export to xml for SIM entries
- *
- * Revision 1.19 2004/07/01 14:38:41 z_stoichev
- * Remember columns sort and order.
- *
- * Revision 1.18 2004/06/24 14:56:03 z_stoichev
- * - Fixed Upload Contacts phone type to SIM issues.
- * - Fixed Max field length for ME and SM Phonebooks.
- * - Fixed Contact name lookup routines use ME phonebook.
- * - Changed Connect after unknown number call is entered.
- * - Changed Explorer Popup menu reorganized.
- * - Added Chat to Contact command to various popup menus.
- * - Added Add to Phonebook to various popup menus.
- * - Added hit Enter in SIM editor to edit contact.
- * - Added Remove favorite item confirmation message.
- * - Added Download entire SIM phonebook.
- * - Added New SIM editor columns (phone type, status).
- * - Broken Phonebook editors Sorting is not remembered.
- *
- * Revision 1.17 2004/06/24 09:10:13 z_stoichev
- * - Added Chat to Contact command to various popup menus.
- * - Added Add to Phonebook to various popup menus.
- * - Added hit Enter in SIM editor to edit contact.
- * - Added Download entire SIM phonebook.
- *
- * Revision 1.16 2004/06/23 13:48:53 z_stoichev
- * Added Chat support
- * Popup menu new items
- *
- * Revision 1.15 2004/06/22 14:33:17 z_stoichev
- * - Fixed SIM database old format detection.
- * - Fixed Copy SIM contacts to Phonebook.
- * - Fixed Export file type filter misusage/order.
- * - Added Import contacts status line feedback.
- * - Added Import/Export SIM contacts (vCard only).
- * - Added Copy from Phonebook to SIM w/phone type.
- *
- * Revision 1.14 2004/06/15 13:01:35 z_stoichev
- * Fix upload to phone changes detection.
- *
- * Revision 1.13 2004/05/21 10:09:05 z_stoichev
- * Changed logging handle routines.
- *
- * Revision 1.12 2004/05/19 18:34:16 z_stoichev
- * Build 0.1.0.35c
- *
- * Revision 1.11 2004/03/26 18:37:40 z_stoichev
- * Build 0.1.0.35 RC5
- *
- * Revision 1.10 2004/03/07 21:55:45 z_stoichev
- * Apply length restrictions when copy ME to/from SM.
- * Sort all in SIM changes misplaced contacts only.
- *
- * Revision 1.9 2004/01/30 16:42:16 z_stoichev
- * Fixed Send contacts from SIM to Phone AV error.
- * Added Progress dialog on Uploading contacts.
- * Added Fma windows update on SMS Delete/Upload.
- *
- * Revision 1.8 2004/01/28 17:35:36 z_stoichev
- * Popup menu rearranged.
- * Allow editing Phone memory.
- *
- * Revision 1.7 2003/12/12 16:54:24 z_stoichev
- * Added view customization support.
- *
- * Revision 1.6 2003/11/28 09:38:07 z_stoichev
- * Merged with branch-release-1-1 (Fma 0.10.28c)
- *
- * Revision 1.5.2.7 2003/11/26 12:27:18 z_stoichev
- * Sort after new contact.
- * Select All works now.
- *
- * Revision 1.5.2.6 2003/11/13 16:37:10 z_stoichev
- * Changed images.
- *
- * Revision 1.5.2.5 2003/11/12 16:21:07 z_stoichev
- * Allow contact properties from Explorer popup menu.
- *
- * Revision 1.5.2.4 2003/11/11 13:11:32 z_stoichev
- * Fixed surname is not cleared on edit.
- *
- * Revision 1.5.2.3 2003/11/10 14:03:10 z_stoichev
- * RC3
- *
- * Revision 1.5.2.2 2003/11/07 13:56:04 z_stoichev
- * SIM view/editor recoded.
- *
- * Revision 1.5.2.1 2003/10/27 07:22:54 z_stoichev
- * Build 0.1.0 RC1 Initial Checkin.
- *
- * Revision 1.5 2003/10/23 11:52:18 z_stoichev
- * Fixed bug for max name and tel length.
- * Popup menu recreated.
- * Font changed.
- *
- * Revision 1.4 2003/10/21 11:59:31 z_stoichev
- * Update SIM sanity checks added.
- * Retrieve max name and tel length.
- * Bugfixes.
- *
- * Revision 1.3 2003/01/30 04:15:57 warren00
- * Updated with header comments
- *
- *
- *******************************************************************************
- }
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- Grids, ExtCtrls, StdCtrls, Math, Menus, VirtualTrees, ImgList, uSyncPhonebook,
- Placemnt;
-
- type
- TSIMData = Record
- imageindex: integer; {0=new,1=modified,2=deleted,3=normal}
- position: integer;
- cname,pnumb: WideString;
- ptype: string[2];
- end;
- PSIMData = ^TSIMData;
-
- TfrmSIMEdit = class(TFrame)
- Panel1: TPanel;
- btnUpdateSIM: TButton;
- cbForce: TCheckBox;
- btnReset: TButton;
- PopupMenu1: TPopupMenu;
- Clear1: TMenuItem;
- Resetchangeflag1: TMenuItem;
- ListNumbers: TVirtualStringTree;
- NoItemsPanel: TPanel;
- N1: TMenuItem;
- N2: TMenuItem;
- Properties1: TMenuItem;
- NewPerson1: TMenuItem;
- UpdateChanged1: TMenuItem;
- UpdateAllRecords1: TMenuItem;
- FormStorage1: TFormStorage;
- N5: TMenuItem;
- UpdateContactsPosition1: TMenuItem;
- UpdateContactsfromPhonebook1: TMenuItem;
- SendAllContactstoPhonebook1: TMenuItem;
- N4: TMenuItem;
- ImportContacts1: TMenuItem;
- ExportContacts1: TMenuItem;
- N6: TMenuItem;
- OpenDialog1: TOpenDialog;
- N3: TMenuItem;
- MessageContact1: TMenuItem;
- CallContact1: TMenuItem;
- ChatContact1: TMenuItem;
- N7: TMenuItem;
- DownloadEntirePhonebook1: TMenuItem;
- SendToPhone1: TMenuItem;
- procedure Button1Click(Sender: TObject);
- procedure StringGridGetEditText(Sender: TObject; ACol, ARow: Integer;
- var Value: String);
- procedure Resetchangeflag1Click(Sender: TObject);
- procedure ListNumbersAfterPaint(Sender: TBaseVirtualTree;
- TargetCanvas: TCanvas);
- procedure ListNumbersCompareNodes(Sender: TBaseVirtualTree; Node1,
- Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
- procedure ListNumbersGetImageIndex(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
- var Ghosted: Boolean; var ImageIndex: Integer);
- procedure ListNumbersGetText(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
- var CellText: WideString);
- procedure ListNumbersHeaderClick(Sender: TVTHeader;
- Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X,
- Y: Integer);
- procedure btnUpdateSIMClick(Sender: TObject);
- procedure btnResetClick(Sender: TObject);
- procedure btnDELClick(Sender: TObject);
- procedure btnEDITClick(Sender: TObject);
- procedure PopupMenu1Popup(Sender: TObject);
- procedure NewPerson1Click(Sender: TObject);
- procedure UpdateChanged1Click(Sender: TObject);
- procedure UpdateAllRecords1Click(Sender: TObject);
- procedure UpdateContactsPosition1Click(Sender: TObject);
- procedure UpdateContactsfromPhonebook1Click(Sender: TObject);
- procedure SendAllContactstoPhonebook1Click(Sender: TObject);
- procedure ListNumbersIncrementalSearch(Sender: TBaseVirtualTree;
- Node: PVirtualNode; const SearchText: WideString;
- var Result: Integer);
- procedure ImportContacts1Click(Sender: TObject);
- procedure DownloadEntirePhonebook1Click(Sender: TObject);
- procedure ListNumbersKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure FormStorage1SavePlacement(Sender: TObject);
- procedure FormStorage1RestorePlacement(Sender: TObject);
- procedure ListNumbersHeaderMouseUp(Sender: TVTHeader;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- private
- { Private declarations }
- FMaxNumbers: cardinal;
- FMaxNameLen,FMaxTelLen: integer;
- FOldText: String;
- function GetSIMCapacity: Integer;
- function FindFreePos: integer;
- procedure FullRefresh;
- procedure UpdateSIM(MaxItems: cardinal = 0);
- procedure AddLog(Msg: string);
- public
- { Public declarations }
- FContact: TContactData;
- SelContact: PSIMData;
- FRendered: Boolean;
- constructor Create(AOwner: TComponent); override;
- procedure RenderData(ForceSMMode: boolean = False);
- procedure UpdatePhonebook;
- procedure OnConnected;
- procedure ExportList(FileType:Integer; Filename: WideString);
- function IsMEMode: boolean;
- function IsRendered: boolean;
- function FindContact(FullName: WideString; var AContact: PSIMData): boolean; overload;
- function FindContact(FullName,NumberType: WideString; var AContact: PSIMData): boolean; overload;
- function FindContact(FullName: WideString; var ANode: PVirtualNode): boolean; overload;
- function DoEdit(AsNew: boolean = False): boolean;
- procedure CheckForChanges;
- end;
-
- implementation
-
- uses Unit1, gsm_sms, uGlobal, uEditContact, uConnProgress, uVcard, uXML, WebUtil;
-
- {$R *.dfm}
-
- { TFrame2 }
-
- constructor TfrmSIMEdit.Create(AOwner: TComponent);
- begin
- inherited;
- { Set defaults }
- FMaxNameLen := 14; FMaxTelLen := 80; FMaxNumbers := 200;
- FRendered := False;
- end;
-
- procedure TfrmSIMEdit.RenderData(ForceSMMode: boolean);
- var
- sl: TStrings;
- i: Integer;
- Item: PSIMData;
- Node: PVirtualNode;
- s, Name, Kind: WideString;
- Number: String;
- pos,state: Integer;
- begin
- { ForceSMMode is used when loading Profile database }
- if not ForceSMMode and IsMEMode then sl := form1.FNodeContactsME.Data
- else sl := form1.FNodeContactsSM.Data;
- try
- ListNumbers.BeginUpdate;
- ListNumbers.Clear;
- ListNumbers.NodeDataSize := sizeof(TSIMData);
- try
- try
- for i := 0 to sl.Count - 1 do begin
- s := sl[i];
- {
- Name := GetToken(s, 0);
- Number := GetToken(s, 1);
- Pos := StrToInt(GetToken(s, 2));
-
- try
- state := StrToInt(GetToken(s, 3));
- except
- state := 3;
- end;
- }
- Name := GetFirstToken(s);
- Number := GetFirstToken(s);
- Pos := StrToInt(GetFirstToken(s));
- state := StrToInt(GetFirstToken(s));
-
- Node := ListNumbers.AddChild(nil);
- item := ListNumbers.GetNodeData(Node);
-
- Form1.ExtractName(Name,Kind);
-
- with item^ do begin
- cname := Name;
- pnumb := Number;
- ptype := Kind;
- imageindex := state;
- position := Pos;
- end;
- end;
-
- FRendered := True;
- except
- ShowMessage('Old data format, please refresh the folder.');
- end;
- finally
- ListNumbers.EndUpdate;
- ListNumbers.Sort(nil, ListNumbers.Header.SortColumn, ListNumbers.Header.SortDirection);
- end;
- except
- end;
- end;
-
- procedure TfrmSIMEdit.Button1Click(Sender: TObject);
- begin
- if not Form1.FConnected then Form1.ActionConnectionConnectExecute(Self);
-
- Form1.ActionContactsDownloadExecute(Self);
- RenderData;
- end;
-
- procedure TfrmSIMEdit.UpdateSIM(MaxItems: cardinal);
- var
- PerformCleanup: boolean;
- i,maxPos,LastPos,numType: Integer;
- w, name, number, buf: WideString;
- Item: PSIMData;
- Node: PVirtualNode;
- frmConnect: TfrmConnect;
- target: string;
- begin
- if IsMEMode then target := 'Phonebook' else target := 'SIM';
- PerformCleanup := MaxItems = ListNumbers.ChildCount[nil];
- Form1.RequestConnection;
- AddLog('Update '+target+' started.');
- frmConnect := GetProgressDialog;
- try
- if Form1.CanShowProgress then
- frmConnect.ShowProgress(Form1.FProgressLongOnly);
- if MaxItems > 0 then
- frmConnect.Initialize(MaxItems,'Updating '+target)
- else
- frmConnect.SetDescr('Updating '+target);
- Form1.Status('Uploading contacts...');
- maxPos := 0;
- try
- if IsMEMode then Form1.TxAndWait('AT+CPBS="ME"')
- else Form1.TxAndWait('AT+CPBS="SM"');
- try
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- if (item.imageindex <> 3) or cbForce.Checked then begin
- numType := 129;
- Name := item.cname;
- Number := item.pnumb;
- if Form1.FUseUTF8 then Name := UTF8Encode(Name);
-
- if maxPos <= item.position then maxPos := item.position;
-
- buf := 'AT+CPBW=' + IntToStr(item.position);
- if Item.imageindex = 2 then begin
- // Delete
- AddLog(Name + ' deleted in '+target+' by FMA.');
- Form1.TxAndWait(buf);
- end
- else begin
- // Update
- if Number[1] = '+' then begin
- Number := copy(Number, 2, length(Number));
- numType := 145;
- end;
- w := Name;
- { NOTE: When writing to SM, <text> shall be written as ôlast nameö + comma +
- white space +öfirst nameö + ô/ö + <type_of_number> }
- if IsMEMode then begin
- { This is not working as described in the docs :/
- i := Pos(' ',w);
- if i <> 0 then
- w := Copy(w,i+1,Length(w)) + ', ' + Copy(w,1,i-1);
- }
- if (Length(w) < (FMaxNameLen-1)) and (item.ptype <> '') then
- case item.ptype[1] of
- 'M': w := w + '/M';
- 'H': w := w + '/H';
- 'W': w := w + '/W';
- 'F': w := w + '/F';
- 'O': w := w + '/O';
- end;
- end
- else begin
- { HACK! remove obsolete '/O' from SIM entries, added by previous FMA releases HACK! }
- i := Length(w);
- if (i > 2) and (w[i-1] = '/') and (Char(w[i]) in ['M','H','W','F','O']) then
- Delete(w,i-1,2);
- end;
- buf := buf + ',"' + Number + '",' + IntToStr(numType) + ',"' + w + '"';
- Form1.TxAndWait(buf);
- AddLog(Name + ' stored in '+target+' by FMA.');
- Item.imageindex := 3;
- end;
- end;
- finally
- frmConnect.IncProgress(1);
- Node := ListNumbers.GetNext(Node);
- ListNumbers.Repaint;
- end;
- { Ususaly happens when you rearrange contacts positions, i.e. modify all of them }
- if PerformCleanup then begin
- Form1.Status('Performing cleanup...');
- frmConnect.SetDescr('Performing cleanup');
- frmConnect.SEProgress1.UnknownMax := True;
- if IsMEMode then LastPos := Form1.frmSyncPhonebook.FMaxRecME
- else LastPos := FMaxNumbers;
- for maxPos := maxPos + 1 to LastPos do begin
- buf := 'AT+CPBW=' + IntToStr(maxPos);
- Form1.TxAndWait(buf);
- end;
- end;
- finally
- UpdatePhonebook;
- end;
- except
- Form1.Status('Error updating memory');
- ShowMessage('Error updating memory');
- AddLog('Update '+target+' failed.');
- end;
- AddLog('Update '+target+' completed.');
- finally
- FreeProgressDialog;
- Form1.Status('');
- end;
- end;
-
- procedure TfrmSIMEdit.btnUpdateSIMClick(Sender: TObject);
- var
- Item: PSIMData;
- Node: PVirtualNode;
- mcount,dcount,count: cardinal;
- s: string;
- err: boolean;
- begin
- mcount := 0; dcount := 0;
-
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- if item.imageindex = 2 then
- // deleted contact
- inc(dcount)
- else
- // then process modified (or all) entries
- if (item.imageindex <> 3) or cbForce.Checked then begin
- { Do sanity check for modified contacts }
- if (Trim(item.cname) = '') and (Trim(item.pnumb) <> '') then
- raise EConvertError.Create('Please enter a contact name at position '+IntToStr(item.position));
- if (Trim(item.cname) <> '') and (Trim(item.pnumb) = '') then
- raise EConvertError.Create('Please enter a phone number at position '+IntToStr(item.position));
- if IsMEMode then err := cardinal(Length(item.cname)) > Form1.frmSyncPhonebook.FMaxNameLen
- else err := Length(item.cname) > FMaxNameLen;
- if err then raise EConvertError.Create('The name at position '+IntToStr(item.position)+' is too long');
- if IsMEMode then err := cardinal(Length(item.pnumb)) > (Form1.frmSyncPhonebook.FMaxTelLen+byte(Pos('+',item.pnumb) <> 0))
- else err := Length(item.pnumb) > (FMaxTelLen+byte(Pos('+',item.pnumb) <> 0));
- if err then raise EConvertError.Create('The number at position '+IntToStr(item.position)+' is too long');
- inc(mcount);
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
-
- count := mcount + dcount;
- if count <> 0 then begin
- if mcount <> 0 then begin
- s := IntToStr(mcount) + ' modified contact';
- if mcount <> 1 then s := s + 's';
- end
- else
- s := '';
- if dcount <> 0 then begin
- if mcount <> 0 then s := s + ' and ';
- s := s + IntToStr(dcount) + ' deleted contact';
- if dcount <> 1 then s := s + 's';
- end;
- case MessageDlg('Changes have been made into current folder.'#13#13+
- 'Confirm sending ' + s + ' to phone?', mtConfirmation, [mbYes, mbNO, mbCANCEL], 0) of
- mrYes: UpdateSIM(count);
- mrCancel: Abort;
- end;
- end;
- end;
-
- procedure TfrmSIMEdit.btnResetClick(Sender: TObject);
- var
- Item: PSIMData;
- Node: PVirtualNode;
- begin
- ListNumbers.BeginUpdate;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- item.imageindex := 3; // mark as not modified
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- ListNumbers.EndUpdate;
- UpdatePhonebook;
- end;
-
- procedure TfrmSIMEdit.StringGridGetEditText(Sender: TObject; ACol,
- ARow: Integer; var Value: String);
- begin
- FOldText := Value;
- end;
-
- procedure TfrmSIMEdit.btnDELClick(Sender: TObject);
- var
- Item: PSIMData;
- Node,Tmp: PVirtualNode;
- s: string;
- begin
- if ListNumbers.SelectedCount = 0 then exit;
- s := 'Deleting ' + IntToStr(ListNumbers.SelectedCount) + ' item(s)';
- if MessageDlg(s+'. Do you wish to continue?',mtConfirmation,[mbYes,mbNo],0) <> ID_YES then
- exit;
- Form1.Status(s+'...');
- ListNumbers.BeginUpdate;
- try
- Node := ListNumbers.GetFirst;
- while Node <> nil do begin
- if ListNumbers.Selected[Node] then begin
- item := ListNumbers.GetNodeData(Node);
- if item.imageindex <> 0 then begin
- item.imageindex := 2;
- end
- else begin
- Tmp := Node;
- if Node <> ListNumbers.GetFirst then begin
- Node := ListNumbers.GetPrevious(Node);
- ListNumbers.DeleteNode(Tmp);
- end
- else begin
- ListNumbers.DeleteNode(Tmp);
- Node := ListNumbers.GetFirst;
- continue;
- end;
- end;
- end;
- Node := ListNumbers.GetNext(Node);
- end;
- finally
- ListNumbers.EndUpdate;
- UpdatePhonebook;
- end;
- Form1.Status('');
- end;
-
- procedure TfrmSIMEdit.Resetchangeflag1Click(Sender: TObject);
- var
- Item: PSIMData;
- Node: PVirtualNode;
- begin
- ListNumbers.BeginUpdate;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- if ListNumbers.Selected[Node] then begin
- item := ListNumbers.GetNodeData(Node);
- item.imageindex := 3;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- ListNumbers.EndUpdate;
- UpdatePhonebook;
- end;
-
- function TfrmSIMEdit.GetSIMCapacity: Integer;
- var
- i: Integer;
- buffer, stop: String;
- slTmp: TStrings;
- begin
- Form1.TxAndWait('AT+CPBS="SM"');
- Form1.TxAndWait('AT+CPBR=?');
- // defaults
- buffer := '';
- stop := '200'; FMaxNameLen := 14; FMaxTelLen := 80;
- // +CPBR: (1-200),80,14
- for i := 0 to Form1.FRxBuffer.Count-1 do
- if Pos('+CPBR',Form1.FRxBuffer.Strings[i]) = 1 then begin
- buffer := Form1.FRxBuffer.Strings[i];
- break;
- end;
- for i := 1 to length(buffer) do begin
- if IsDelimiter('()-,', buffer, i) then buffer[i] := ' ';
- end;
- // +CPBR: 1 200 80 14
- if buffer <> '' then begin
- slTmp := TStringList.Create;
- try
- slTmp.DelimitedText := buffer;
- stop := slTmp.Strings[2];
- Form1.Debug('SIM: max entries = '+stop);
- FMaxTelLen := StrToInt(slTmp.Strings[3]);
- Form1.Debug('SIM: max tel length = '+slTmp.Strings[3]);
- FMaxNameLen := StrToInt(slTmp.Strings[4]);
- Form1.Debug('SIM: max name length = '+slTmp.Strings[4]);
- finally
- slTmp.Free;
- end;
- end;
- Result := StrToInt(stop);
- end;
-
- procedure TfrmSIMEdit.OnConnected;
- begin
- FMaxNumbers := GetSIMCapacity;
- end;
-
- procedure TfrmSIMEdit.ListNumbersAfterPaint(Sender: TBaseVirtualTree;
- TargetCanvas: TCanvas);
- begin
- NoItemsPanel.Visible := ListNumbers.ChildCount[nil] = 0;
- end;
-
- procedure TfrmSIMEdit.ListNumbersCompareNodes(Sender: TBaseVirtualTree;
- Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer);
- var
- SIM1, SIM2: PSIMData;
- begin
- SIM1 := Sender.GetNodeData(Node1);
- SIM2 := Sender.GetNodeData(Node2);
-
- if Column = 0 then begin
- if SIM1.position > SIM2.position then
- Result := 1
- else
- if SIM1.position < SIM2.position then
- Result := -1
- else
- Result := 0;
- end
- else if Column = 1 then Result := WideCompareStr(SIM1.cname, SIM2.cname)
- else if Column = 2 then Result := WideCompareStr(SIM1.pnumb, SIM2.pnumb);
- end;
-
- procedure TfrmSIMEdit.ListNumbersGetImageIndex(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
- var Ghosted: Boolean; var ImageIndex: Integer);
- var
- SIM: PSIMData;
- begin
- if Column = 0 then begin
- if (Kind = ikNormal) or (Kind = ikSelected) then begin
- SIM := Sender.GetNodeData(Node);
- ImageIndex := SIM.imageindex;
- end
- else ImageIndex := -1;
- end;
- end;
-
- procedure TfrmSIMEdit.ListNumbersGetText(Sender: TBaseVirtualTree;
- Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
- var CellText: WideString);
- var
- SIM: PSIMData;
- begin
- SIM := Sender.GetNodeData(Node);
-
- if Column = 0 then CellText := IntToStr(SIM.position)
- else if Column = 1 then CellText := SIM.cname
- else if Column = 2 then CellText := SIM.pnumb
- else if Column = 3 then begin
- CellText := '';
- if SIM.ptype = 'M' then CellText := 'Cell';
- if SIM.ptype = 'W' then CellText := 'Work';
- if SIM.ptype = 'H' then CellText := 'Home';
- if SIM.ptype = 'O' then CellText := 'Other';
- if SIM.ptype = 'F' then CellText := 'Fax';
- end
- else if Column = 4 then begin
- CellText := '';
- case SIM.imageindex of
- 0: CellText := 'New contact';
- 1: CellText := 'Modified contact';
- 2: CellText := 'Deleted contact';
- 3: CellText := '';
- end;
- end;
- end;
-
- procedure TfrmSIMEdit.ListNumbersHeaderClick(Sender: TVTHeader;
- Column: TColumnIndex; Button: TMouseButton; Shift: TShiftState; X,
- Y: Integer);
- begin
- if Button = mbLeft then begin
- if Column = Sender.SortColumn then begin
- if Sender.SortDirection = sdDescending then
- Sender.SortDirection := sdAscending
- else
- Sender.SortDirection := sdDescending;
- end
- else
- Sender.SortColumn := Column;
- ListNumbers.Sort(nil, ListNumbers.Header.SortColumn, ListNumbers.Header.SortDirection);
- end;
- end;
-
- procedure TfrmSIMEdit.btnEDITClick(Sender: TObject);
- var
- Node :PVirtualNode;
- begin
- Node := ListNumbers.FocusedNode;
- if Node <> nil then begin
- SelContact := ListNumbers.GetNodeData(Node);
- DoEdit;
- end;
- end;
-
- procedure TfrmSIMEdit.PopupMenu1Popup(Sender: TObject);
- begin
- Properties1.Enabled := ListNumbers.SelectedCount = 1;
- SendAllContactstoPhonebook1.Enabled := not Form1.FStartupOptions.NoIRMC;
- SendAllContactstoPhonebook1.Visible := not IsMEMode;
- UpdateContactsfromPhonebook1.Enabled := SendAllContactstoPhonebook1.Enabled;
- UpdateContactsfromPhonebook1.Visible := SendAllContactstoPhonebook1.Visible;
- N3.Visible := SendAllContactstoPhonebook1.Visible;
- end;
-
- function TfrmSIMEdit.DoEdit(AsNew: boolean): boolean;
- var
- Node: PVirtualNode;
- i: integer;
- begin
- Result := False;
- with TfrmEditContact.Create(nil) do
- try
- // set restrictions
- MaxFullNameLen := FMaxNameLen;
- txtName.MaxLength := FMaxNameLen;
- txtCell.MaxLength := FMaxTellen;
- // update contact state
- if AsNew then FillChar(FContact,SizeOf(FContact),0)
- else begin
- { Set contact name and surname }
- i := Pos(' ',Selcontact^.cname);
- if i <> 0 then begin
- FContact.name := Copy(Selcontact^.cname,1,i-1);
- FContact.surname := Copy(Selcontact^.cname,i+1,Length(Selcontact^.cname)-i);
- end
- else begin
- FContact.name := Selcontact^.cname;
- FContact.surname := '';
- end;
- { Set number according to phone type }
- FContact.cell := '';
- FContact.work := '';
- FContact.home := '';
- FContact.fax := '';
- FContact.other := '';
- if Selcontact^.pnumb <> '' then
- if not IsMEMode or (Selcontact^.ptype = '') then
- FContact.cell := Selcontact^.pnumb
- else
- case Selcontact^.ptype[1] of
- 'M': FContact.cell := Selcontact^.pnumb;
- 'W': FContact.work := Selcontact^.pnumb;
- 'H': FContact.home := Selcontact^.pnumb;
- 'F': FContact.fax := Selcontact^.pnumb;
- 'O': FContact.other := Selcontact^.pnumb;
- end;
- end;
- contact := FContact;
- UseSIMMode := True;
- // edit contact as a SIM entry
- if ShowModal = mrOk then begin
- if Modified then with ListNumbers do begin
- // apply total updates
- BeginUpdate;
- try
- if AsNew then begin // create new node
- Node := AddChild(nil);
- Selcontact := ListNumbers.GetNodeData(Node);
- end
- else
- Node := nil;
- try
- { copy all data }
- FContact := contact;
- Selcontact^.cname := FContact.name;
- if FContact.surname <> '' then
- Selcontact^.cname := Selcontact^.cname + ' ' + FContact.surname;
-
- { get new number }
- if AsNew then begin
- if FContact.cell <> '' then begin
- Selcontact^.pnumb := FContact.cell;
- Selcontact^.ptype := 'M';
- end;
- if FContact.work <> '' then begin
- Selcontact^.pnumb := FContact.work;
- Selcontact^.ptype := 'W';
- end;
- if FContact.home <> '' then begin
- Selcontact^.pnumb := FContact.home;
- Selcontact^.ptype := 'H';
- end;
- if FContact.fax <> '' then begin
- Selcontact^.pnumb := FContact.fax;
- Selcontact^.ptype := 'F';
- end;
- if FContact.other <> '' then begin
- Selcontact^.pnumb := FContact.other;
- Selcontact^.ptype := 'O';
- end;
- end
- else
- if not IsMEMode or (Selcontact^.ptype = '') then
- Selcontact^.pnumb := FContact.cell
- else
- case Selcontact^.ptype[1] of
- 'M': Selcontact^.pnumb := FContact.cell;
- 'W': Selcontact^.pnumb := FContact.work;
- 'H': Selcontact^.pnumb := FContact.home;
- 'F': Selcontact^.pnumb := FContact.fax;
- 'O': Selcontact^.pnumb := FContact.other;
- end;
-
- if AsNew then begin
- Selcontact^.imageindex := 0;
- Selcontact^.position := FindFreePos;
- if Selcontact^.position = -1 then
- DeleteNode(Node)
- else
- Result := True;
- end
- else
- if Selcontact^.imageindex <> 0 then begin // mark as modified
- Selcontact^.imageindex := 1;
- Result := True;
- end;
- except;
- if AsNew then DeleteNode(Node);
- raise;
- end;
- UpdatePhonebook;
- finally
- EndUpdate;
- end;
- end;
- end;
- finally
- Free;
- end;
- ListNumbers.Sort(nil, ListNumbers.Header.SortColumn, ListNumbers.Header.SortDirection);
- end;
-
- procedure TfrmSIMEdit.NewPerson1Click(Sender: TObject);
- var
- OK: boolean;
- begin
- if IsMEMode then
- OK := ListNumbers.RootNodeCount < Form1.frmSyncPhonebook.FMaxRecME
- else
- OK := ListNumbers.RootNodeCount < FMaxNumbers;
- if OK then
- DoEdit(True)
- else
- ShowMessage('No more space in memory! New contact can not be created.');
- end;
-
- procedure TfrmSIMEdit.UpdateChanged1Click(Sender: TObject);
- begin
- cbForce.Checked := False;
- btnUpdateSIM.Click;
- end;
-
- procedure TfrmSIMEdit.UpdateAllRecords1Click(Sender: TObject);
- begin
- cbForce.Checked := True;
- btnUpdateSIM.Click;
- end;
-
- procedure TfrmSIMEdit.AddLog(Msg: string);
- begin
- Form1.SyncLog(Msg);
- end;
-
- function TfrmSIMEdit.FindFreePos: integer;
- var
- Node :PVirtualNode;
- Item: PSIMData;
- Pos: cardinal;
- found: boolean;
- begin
- Pos := 1;
- while Pos <= FMaxNumbers do begin
- found := false;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- if cardinal(item.position) = Pos then begin
- found := true;
- break;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- if not found then break;
- Pos := Pos + 1;
- end;
- if Pos <= FMaxNumbers then Result := Pos
- else Result := -1;
- end;
-
- procedure TfrmSIMEdit.UpdateContactsPosition1Click(Sender: TObject);
- var
- Pos: Integer;
- Item: PSIMData;
- Node: PVirtualNode;
- begin
- if MessageDlg('Sorting contacts will replace all contacts position. Are you sure?',
- mtConfirmation, [mbYes, mbNO], 0) <> mrYes then exit;
- Pos := 1;
- try
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- if item.position <> Pos then begin
- item.position := Pos;
- item.imageindex := 1; // mark as modified
- end;
- inc(Pos);
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- finally
- ListNumbers.Sort(nil, ListNumbers.Header.SortColumn, ListNumbers.Header.SortDirection);
- UpdatePhonebook;
- end;
- end;
-
- procedure TfrmSIMEdit.UpdateContactsfromPhonebook1Click(Sender: TObject);
- var
- sl,dl: TStrings;
- i: integer;
- s,kind,item,t: WideString;
- begin
- sl := TStrings(Form1.FNodeContactsME.Data); // source
- dl := TStrings(Form1.FNodeContactsSM.Data); // destination
-
- if ListNumbers.ChildCount[nil] <> 0 then begin
- if sl.Count = 0 then begin
- if MessageDlg('Phonebook is empty. All current SIM entries will be deleted. Continue anyway?',
- mtConfirmation, [mbYes, mbNO], 0) <> mrYes then exit;
- end
- else
- if MessageDlg('Copy all contacts from Phonebook. Current SIM entries will be deleted. Are you sure?',
- mtConfirmation, [mbYes, mbNO], 0) <> mrYes then exit;
- end;
-
- { Clear SIM database }
- dl.Clear;
- Form1.FNodeContactsSM.DeleteChildren;
- try
- { Build new database }
- for i := 0 to sl.Count-1 do begin
- // '"Alycia/M",+359887555555555,0'
- { get full name }
- item := GetToken(sl.Strings[i],0);
- Form1.ExtractName(item,kind);
- if kind <> '' then kind := '/' + kind;
- item := Copy(item,1,FMaxNameLen) + kind;
- { get number }
- t := GetToken(sl.Strings[i],1);
- s := Copy(t,1,FMaxTelLen+byte(Pos('+',t) <> 0));
- { Construct a database item }
- item := '"' + item + '",' + s + ',' + IntToStr(i+1) + ',1'; // and mark (1) as modified
- { Add to SIM database }
- dl.Add(item);
- end;
- finally
- Form1.RenderContactList(Form1.FNodeContactsSM);
- { Update view }
- RenderData;
- Form1.Status('Copy from Phonebook: ' + IntToStr(ListNumbers.ChildCount[nil]) + ' new items');
- end;
- end;
-
- procedure TfrmSIMEdit.SendAllContactstoPhonebook1Click(Sender: TObject);
- var
- Item: PSIMData;
- Node,NewNode: PVirtualNode;
- Contact: PContactData;
- NewCnt,UpdCnt: cardinal;
- s,T,N: WideString;
- i,j: integer;
- begin
- NewCnt := 0;
- UpdCnt := 0;
- try
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- item := ListNumbers.GetNodeData(Node);
- { Sanity check phone number length }
- i := Form1.frmSyncPhonebook.FMaxTellen;
- if Length(item.pnumb) < i then i := Length(item.pnumb);
- s := Copy(item.pnumb,1+Length(item.pnumb)-i,i);
- { If contact already exists? }
- if Form1.frmSyncPhonebook.FindContact(item.cname,contact) then begin
- { Check if the number already exists for that contact
- O := GetContactPhoneType(contact,s); // get type if number found in ME contact
- if O = '' then T := item.ptype
- else T := O;
- }
- T := item.ptype;
- {}
- if T = 'W' then N := contact^.work else
- if T = 'H' then N := contact^.home else
- if T = 'F' then N := contact^.fax else
- if T = 'O' then N := contact^.other else
- N := contact^.cell; // Default to '' or 'M' phone type
- { Number position already filled in? }
- if N <> '' then
- // TODO: Add wizard for asking where to store new number
- if MessageDlg('(TODO: add wizard here) Contact '+item.cname+' already exists.'#13#13+
- 'Do you want to replace its Phonebook number [' + N + '] with current SIM number [' + s + '] ?',
- mtConfirmation, [mbYes, mbNO], 0) <> mrYes then
- continue;
- if T = 'W' then contact^.work := s else
- if T = 'H' then contact^.home := s else
- if T = 'F' then contact^.fax := s else
- if T = 'O' then contact^.other := s else
- contact^.cell := s;
- contact^.StateIndex := 1; // contact modified
- inc(UpdCnt);
- end
- else begin
- NewNode := Form1.frmSyncPhonebook.ListContacts.AddChild(nil);
- contact := Form1.frmSyncPhonebook.ListContacts.GetNodeData(NewNode);
- FillChar(contact^,SizeOf(contact^),0);
- contact^.cell := item.pnumb;
- contact^.StateIndex := 0; // new contact
- s := Copy(item.cname,1,Form1.frmSyncPhonebook.FMaxNameLen+byte(Pos(' ',s) <> 0)); // sanity check name length
- j := Pos(' ',s);
- if j = 0 then
- contact^.name := s
- else begin
- contact^.name := Copy(s,1,j-1);
- contact^.surname := Copy(s,j+1,Length(s)-j);
- end;
- inc(NewCnt);
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- finally
- if (NewCnt + UpdCnt) <> 0 then Form1.UpdateMEPhonebook;
- Form1.Status('Copy to Phonebook: ' + IntToStr(NewCnt)+' new, ' + IntToStr(UpdCnt) + ' modified and ' +
- IntToStr(ListNumbers.ChildCount[nil] - NewCnt - UpdCnt) + ' items skipped');
- end;
- end;
-
- function TfrmSIMEdit.IsMEMode: boolean;
- begin
- Result := Form1.Explorer.Selected = Form1.FNodeContactsME;
- end;
-
- procedure TfrmSIMEdit.UpdatePhonebook;
- begin
- if IsMEMode then
- Form1.UpdateMEPhonebook
- else
- Form1.UpdateSMPhonebook;
- end;
-
- function TfrmSIMEdit.IsRendered: boolean;
- const
- LastIsME: boolean = False;
- begin
- Result := (LastIsME = IsMEMode) and FRendered;
- LastIsME := IsMEMode;
- end;
-
- procedure TfrmSIMEdit.CheckForChanges;
- var
- Modified: boolean;
- Contact: PSIMData;
- Node :PVirtualNode;
- begin
- Modified := False;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- Contact := ListNumbers.GetNodeData(Node);
- if Contact^.imageindex <> 3 then begin
- Modified := True;
- break;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- if Modified then UpdateChanged1.Click;
- end;
-
- procedure TfrmSIMEdit.ListNumbersIncrementalSearch(
- Sender: TBaseVirtualTree; Node: PVirtualNode;
- const SearchText: WideString; var Result: Integer);
- var
- SIM: PSIMData;
- Text: WideString;
- begin
- SIM := Sender.GetNodeData(Node);
- Text := Copy(SIM.cname,1,Length(SearchText));
- Result := WideCompareText(SearchText,Text);
- end;
-
- procedure TfrmSIMEdit.ImportContacts1Click(Sender: TObject);
- var
- i,j,adds,mods: integer;
- Node: PVirtualNode;
- AContact: TContactData;
- PContact: PContactData;
- contact: PSIMData;
- sl: TStringList;
- F,N,T: WideString;
- Modified: boolean;
- dlg: TfrmConnect;
- VCard: TVCard;
- begin
- if not OpenDialog1.Execute then exit;
- Update;
- PContact := @AContact;
- dlg := GetProgressDialog;
- VCard := TVCard.Create;
- try
- if Form1.CanShowProgress then
- dlg.ShowProgress(Form1.FProgressLongOnly);
- dlg.Initialize(OpenDialog1.Files.Count,'Importing SIM contacts');
-
- Form1.Status('Importing contacts...');
- //SyncLog('Import started');
-
- adds := 0; mods := 0;
- //ListContacts.BeginUpdate;
- sl := TStringList.Create;
- try
- for i := 0 to OpenDialog1.Files.Count-1 do begin
- sl.LoadFromFile(OpenDialog1.Files[i]);
- dlg.IncProgress(1);
- VCard.Clear;
- VCard.Raw := sl;
- vCard2Contact(VCard,PContact);
- F := GetvCardFullName(VCard);
- { Process all contact numbers }
- for j := 1 to 4 do begin
- case j of
- 1: N := PContact^.cell;
- 2: N := PContact^.work;
- 3: N := PContact^.home;
- 4: N := PContact^.other;
- end;
- if N = '' then continue;
- T := GetContactPhoneType(PContact,N);
- Modified := False;
- // ask to replace old record, if present
- if FindContact(F,T,contact) then begin
- { TODO: Add dialog with replace details }
- if T <> 'O' then // do not owerwrite Other type, but create a new record instead
- case MessageDlg('(TODO: add wizard here) Contact ' + F + ' already exists. Do you want to replace its current number [' +
- contact^.pnumb + '] with imported number [' + N + '] ?'#13#13'(Click No to add it as a New contact)',
- mtConfirmation,[mbYes,mbNo,mbCancel],0) of
- mrYes: begin
- //SyncLog(F + ' modified in FMA by Import.');
- Modified := True;
- end;
- //mrNo: SyncLog(F + ' added in FMA by Import (as dublicate).');
- mrCancel: Abort;
- end;
- //else SyncLog(F + ' added to FMA by Import.');
- end;
- //else SyncLog(F + ' added to FMA by Import.');
- if not Modified then begin
- Node := ListNumbers.AddChild(nil);
- contact := ListNumbers.GetNodeData(Node);
- contact^.position := FindFreePos;
- contact^.ptype := T;
- end;
- contact^.cname := F;
- contact^.pnumb := N;
- if Modified then begin
- contact^.imageindex := 1;
- inc(mods);
- end
- else begin
- contact^.imageindex := 0;
- inc(adds);
- end;
- end;
- ListNumbers.Update;
- end;
- finally
- sl.free;
- if (adds <> 0) or (mods <> 0) then begin
- //ListContacts.EndUpdate;
- ListNumbers.Sort(nil, ListNumbers.Header.SortColumn, ListNumbers.Header.SortDirection);
- Form1.UpdateSMPhonebook;
- Form1.Debug('Imported '+IntToStr(adds+mods)+' item(s)... ('+IntToStr(adds)+' added, '+IntToStr(mods)+' modified)');
- end;
- end;
- finally
- VCard.Free;
- FreeProgressDialog;
- //SyncLog('Import finished');
- Form1.Status('Import complete.');
- end;
- end;
-
- function TfrmSIMEdit.FindContact(FullName: WideString;
- var AContact: PSIMData): boolean;
- var
- Node :PVirtualNode;
- begin
- Result := False;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- AContact := ListNumbers.GetNodeData(Node);
- if WideCompareText(FullName,AContact^.cname) = 0 then begin
- Result := True;
- break;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- end;
-
- function TfrmSIMEdit.FindContact(FullName: WideString;
- var ANode: PVirtualNode): boolean;
- var
- Node :PVirtualNode;
- AContact: PSIMData;
- begin
- Result := False;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- AContact := ListNumbers.GetNodeData(Node);
- if WideCompareText(FullName,AContact^.cname) = 0 then begin
- ANode := Node;
- Result := True;
- break;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- end;
-
- function TfrmSIMEdit.FindContact(FullName, NumberType: WideString;
- var AContact: PSIMData): boolean;
- var
- Node :PVirtualNode;
- begin
- Result := False;
- Node := ListNumbers.GetFirst;
- while Node <> nil do
- try
- AContact := ListNumbers.GetNodeData(Node);
- if (WideCompareText(FullName,AContact^.cname) = 0) and
- (WideCompareText(NumberType,AContact^.ptype) = 0) then begin
- Result := True;
- break;
- end;
- finally
- Node := ListNumbers.GetNext(Node);
- end;
- end;
-
- procedure TfrmSIMEdit.ExportList(FileType: Integer; Filename: WideString);
- var
- node: PVirtualNode;
- contact: PSIMData;
- AContact: TContactData;
- PContact: PContactData;
- sl: TStringList;
- str: WideString;
- VCard: TVCard;
- i: integer;
- s: string;
- XML: TXML;
- CurNodeName: string;
- begin
- { TODO: export all records/numbers for a contact at once in a vCard file }
- PContact := @AContact;
- case FileType of
- 1:begin//vCard
- VCard := TVCard.Create;
- sl := TStringList.Create;
- try
- with ListNumbers do begin
- node := GetFirst;
- if node <> nil then
- repeat
- try
- if Selected[node] then begin
- contact := GetNodeData(node);
- FillChar(AContact,SizeOf(AContact),0);
- SetContactFullName(PContact,contact^.cname);
- if contact^.ptype = 'W' then PContact^.work := contact^.pnumb else
- if contact^.ptype = 'H' then PContact^.home := contact^.pnumb else
- if contact^.ptype = 'F' then PContact^.fax := contact^.pnumb else
- if contact^.ptype = 'O' then PContact^.other := contact^.pnumb else
- PContact^.cell := contact^.pnumb;
- Contact2vCard(PContact,VCard);
- sl.Clear;
- sl.AddSTrings(VCard.Raw);
- if ListNumbers.SelectedCount <> 1 then begin
- str := contact^.ptype;
- if str = 'O' then str := ''; // hide Other type
- if str <> '' then str := ' ('+str+')';
- str := Trim(contact^.cname) + str;
- str := StringReplace(str,' ','-',[rfReplaceAll]);
- str := ChangeFileExt(FileName,'-'+str)+ExtractFileExt(Filename);
- end
- else
- str := Filename;
- i := 0; s := str;
- while FileExists(s) do begin
- inc(i);
- s := ChangeFileExt(str,'') + ' (' + IntToStr(i) + ')' + ExtractFileExt(str);
- end;
- sl.SaveToFile(s);
- end;
- except
- end;
- node := GetNext(node);
- until node = nil;
- end;
- finally
- sl.Free;
- VCard.Free;
- end;
- end;
-
- 2:begin//xml
- XML := TXML.Create();
- XML.TagName := 'fma_contacts';
-
- try
- with ListNumbers do
- begin
- node := GetFirst;
- if node <> nil then
- repeat
- try
- if Selected[node] then
- begin
- contact := GetNodeData(node);
- FillChar(AContact,SizeOf(AContact),0);
- SetContactFullName(PContact,contact^.cname);
-
- if contact^.ptype = 'W' then CurNodeName := 'work' else
- if contact^.ptype = 'H' then CurNodeName := 'home' else
- if contact^.ptype = 'F' then CurNodeName := 'fax' else
- if contact^.ptype = 'O' then CurNodeName := 'other' else
- CurNodeName := 'cell';
-
- with XML.AddChild('contact') do
- begin
- AddChild('name', HTMLEncode(UTF8Encode(PContact^.name), False));
- AddChild(CurNodeName, HTMLEncode(UTF8Encode(contact^.pnumb), False));
- AddChild('position', HTMLEncode(UTF8Encode(IntToStr(contact^.position)), False));
- end;
- end;
- except
- end;
- node := GetNext(node);
- until node = nil;
- end;
-
- XML.Save(FileName);
- finally
- XML.Free();
- end;
- end;
- else
- raise Exception.Create('Not implemented yet');
- end;
- end;
-
- procedure TfrmSIMEdit.DownloadEntirePhonebook1Click(Sender: TObject);
- begin
- if MessageDlg('Local Phonebook will be replaced with a fresh copy from the phone.'#13#13+
- 'Any local changes will be lost. Do you wish to continue?',
- mtConfirmation,[mbYes,mbNo],0) = ID_YES then begin
- ListNumbers.Clear;
- FullRefresh;
- end;
- end;
-
- procedure TfrmSIMEdit.ListNumbersKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if (Key = VK_RETURN) and (ListNumbers.SelectedCount = 1) then
- btnEditClick(nil);
- end;
-
- procedure TfrmSIMEdit.FullRefresh;
- begin
- Form1.ActionContactsDownload.Execute;
- UpdatePhonebook;
- end;
-
- procedure TfrmSIMEdit.FormStorage1SavePlacement(Sender: TObject);
- var
- s: string;
- i: integer;
- begin
- with ListNumbers.Header do begin
- s := IntToStr(SortColumn)+','+IntToStr(Ord(SortDirection));
- for i := 0 to Columns.Count-1 do
- s := s+','+IntToStr(Columns[i].Width)+','+IntToStr(Columns[i].Position);
- end;
- FormStorage1.StoredValue['ListHeader'] := s;
- end;
-
- procedure TfrmSIMEdit.FormStorage1RestorePlacement(Sender: TObject);
- var
- s: widestring;
- i: integer;
- begin
- s := FormStorage1.StoredValue['ListHeader'];
- if s <> '' then
- try
- with ListNumbers.Header do begin
- SortColumn := StrToInt(GetFirstToken(s));
- SortDirection := TSortDirection(StrToInt(GetFirstToken(s)));
- for i := 0 to Columns.Count-1 do begin
- Columns[i].Width := StrToInt(GetFirstToken(s));
- Columns[i].Position := StrToInt(GetFirstToken(s));
- end;
- end;
- except
- end;
- end;
-
- procedure TfrmSIMEdit.ListNumbersHeaderMouseUp(Sender: TVTHeader;
- Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
- begin
- FormStorage1SavePlacement(nil);
- end;
-
- end.
-
-